#include "FileSystem.h"
#include <stdlib.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>


struct FileSystem
{
    char * dirPath;// 根目录

};

// 文件系统初始化
FileSys *FileSystemInit(const char *DirPath)
{
    FileSys *fs = (FileSys *)malloc(sizeof(FileSys));
    if (fs == NULL)
    {
        printf("FileSystemInit malloc error!\n");
        return NULL;
    }
    DIR *dir = opendir(DirPath);// 打开目录
    if (dir == NULL)// 目录不存在
    {
        if (mkdir(DirPath, 0777) != 0)// 创建目录
        {
            printf("创建文件夹失败!\n");
            free(fs);
            return NULL;
        }
        fs->dirPath = strdup(DirPath);// 复制目录路径
        return fs;// 返回文件系统
    }
    else
    {
        closedir(dir);
        fs->dirPath = strdup(DirPath);// 复制目录路径
        return fs;// 
    }
}

// 在根目录下创建新文件夹
bool CreateNewDirInFs(FileSys *fs, const char *DirName)
{
    char DirPath[1024] = { 0 };
    sprintf(DirPath, "%s/%s", fs->dirPath, DirName);// 将两个字符串以指定的格式连接起来，并将结果存储在 DirPath 数组中。
    if (mkdir(DirPath, 0777) != 0)// 创建目录
    {
        perror("mkdir error!");
        return false;
    }
    return true;
}

// 在根目录下删除一个文件夹
bool DeleteDirInFs(FileSys *fs, const char *DirName)
{
    char DirPath[1024] = { 0 };
    sprintf(DirPath, "%s/%s", fs->dirPath, DirName);// 将两个字符串以指定的格式连接起来，并将结果存储在 DirPath 数组中。
    if (rmdir(DirPath) != 0)// 删除目录
    {
        perror("rmdir error!");
        return false;
    }
    return true;
}

// 在根目录下是否存在一个DirName文件夹
bool IsDirExist(FileSys *fs, const char *DirName)
{
    DIR *dir = opendir(fs->dirPath);
    if (dir == NULL)
    {
        perror("opendir error!");
        return false;
    }
    struct dirent *entry;
    while ((entry = readdir(dir)) != NULL)
    {
        if (strcmp(entry->d_name, DirName) == 0)
        {
            closedir(dir);
            return true;
        }
    }
    closedir(dir);
    return false;
}
